package Thread;

import java.util.concurrent.TimeUnit;

public class Jion {
    public static void main(String[] args) {
        try {
            test7();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    /**
     * 线程 join
     * 在很多情况下，线程之间的协作和人与人之间的协作非常类似，比如我们做软件开发，会有需求工程师
     * 先对系统的需求和功能点进行整理和总结，然后提供好需求文档，接下来才是前端后端的一拥而上。这
     * 个开发过程中，显然是分工合作，那么前端、后端、需求都可以抽象成一个线程，但是前后端线程的工
     * 作依赖于需求线程，也就是说，必须需求定下来之后，前端后端才可以工作。
     * 很多时候，一个线程的输入可能非常依赖于另一个线程的输出，这个线程就需要等待依赖线程执行完
     * 毕，才能继续执行，这个时候就可以使用 join 方法。
     */
    public static void test7() throws InterruptedException {
        Thread t1 = new Thread(new Product());
        Thread t2 = new Thread(new Front());
        Thread t3 = new Thread(new Back());
        t1.start();
        t1.join(5000);
        t2.start();
        t3.start();
    }
}

class Product implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("产品整理需求中....");
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Front implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("前端程序员正在写页面...");
        }
    }
}

class Back implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("后端程序员正在写接口...");
        }
    }
}

